home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2003 June / macformat-130.iso / mac / Reviewed⁄Demos / Spearhead Demo / demota / pak1.pk3 / global / pocketlight.scr < prev    next >
Encoding:
Text File  |  2002-10-21  |  13.8 KB  |  411 lines

  1. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  3. //
  4. // Pocketlights : triggerable flashing light effects
  5. //
  6. // Adding to map:
  7. //
  8. //        In the level script, include the line "exec global/pocketlight.scr::PocketLightsInit" before the level starts.
  9. //
  10. // Set-up:
  11. //            The setup consist of 2 components:
  12. //            -trigger                The trigger for the pocketlight
  13. //            -pocketlight entity        The pocketlight to spawn
  14. //
  15. //            Trigger:
  16. //            - Place a trigger_multiple entity and assign the following keys:
  17. //                $targetname        -    must be "pocketlighttrigger" (without the quotes).
  18. //                #set            -    (optional) set to any number you like. Mainly used to reference a group of lights. 
  19. //                                    It is not necessary if you're connecting(linking) pocketlight entities or other
  20. //                                    trigger entities to it.
  21. //                #retrigger        -    (optional) if you want this trigger to retrigger
  22. //                #removelights    -    (optional) Set this to 1 if you want this trigger to remove pocketlights with the
  23. //                                    specified #set number above.
  24. //            - (optional) You can connect/link pocketlight entities or other triggers to the trigger
  25. //
  26. //            Pocketlight entity
  27. //            - Place a script_origin entity and assign the following keys:
  28. //                $targetname        -    must be "pocketlightspawner" (without the quotes).
  29. //                                    *NOTE*: this is not necessary if this entity is connected/linked to a trigger
  30. //                #set            -    (optional) set to any number you like. Mainly used to reference a group of lights. 
  31. //                                    *NOTE*: this is not necessary if this entity is connected/linked to a trigger
  32. //                #redcolor        -    red color component intensity.  Set to a value between 0.0 and 1.0
  33. //                #greencolor        -    green color component intensity.  Set to a value between 0.0 and 1.0
  34. //                #bluecolor        -    blue color component intensity.  Set to a value between 0.0 and 1.0
  35. //                #lightradius    -    the radius that this light will effect.  Set to any range you like.
  36. //                #fadeintime        -    the amount of time to fade in the color.  The value is in seconds (0.5 = half a second).
  37. //                #holdtime        -    (optional)the amount of time to hold the color after fading in.  The value is in seconds (0.5 = half a second).
  38. //                #fadeouttime    -    the amount of time to fade out the color.  The value is in seconds (0.5 = half a second).
  39. //                #loop            -    (optional) if you want to loop this effect.
  40. //
  41. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  42. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  43.  
  44. PocketLightsInit:
  45.     //level waittill prespawn
  46.     
  47.     local.newset = 3152930
  48.     
  49.     if ($pocketlighttrigger)
  50.     {
  51.         println ("***Number of pocketlighttrigger found: " + $pocketlighttrigger.size)
  52.         
  53.         local.i = 1
  54.         while ($pocketlighttrigger.size > 0)
  55.         {
  56.             local.triggerent = $pocketlighttrigger[local.i]
  57.             if (local.triggerent[local.i].set == NIL)
  58.             {
  59.                 local.triggerent[local.i].set = local.newset
  60.                 local.newset = local.newset + 1
  61.             }
  62.             
  63.             println ("***Setting pocketlighttrigger at " + local.triggerent[local.i].origin)
  64.             if (local.triggerent[local.i].target)
  65.             {
  66.                 local.entstring = local.triggerent[local.i].target
  67.                 local.ent = $(local.triggerent[local.i].target)
  68.                 println ("***Has target " + local.triggerent[local.i].target + " with size " + local.ent.size)
  69.                 waitthread PocketLightsTraverseTargets local.ent local.entstring local.triggerent[local.i].set
  70.             }
  71.             //println ("***ReallySetting pocketlighttrigger at " + local.triggerent[local.i].origin)
  72.             local.triggerent[local.i].target = ""
  73.             waitthread PocketLightsSetTrigger local.triggerent[local.i] local.triggerent[local.i].set
  74.         }
  75.  
  76.     }
  77.     else
  78.     {
  79.         println "****No pocketlighttrigger found"
  80.     }
  81.  
  82.     if ($pocketlightspawner)
  83.     {
  84.         println ("***Number of pocketlightspawner found: " + $pocketlightspawner.size)
  85.         
  86.         local.i = 1
  87.         
  88.         while ($pocketlightspawner.size > 0)
  89.         {
  90.             local.triggerent = $pocketlightspawner[local.i]
  91.             if (local.triggerent[local.i].set == NIL)
  92.             {
  93.                 local.triggerent[local.i].set = local.newset
  94.                 local.newset = local.newset + 1
  95.             }
  96.             
  97.             println ("***Setting pocketlightspawner at " + local.triggerent[local.i].origin)
  98.             if (local.triggerent[local.i].target)
  99.             {
  100.                 local.entstring = local.triggerent[local.i].target
  101.                 local.ent = $(local.triggerent[local.i].target)
  102.                 println ("***Has target " + local.triggerent[local.i].target + " with size " + local.ent.size)
  103.                 waitthread PocketLightsTraverseTargets local.ent local.entstring local.triggerent[local.i].set
  104.             }
  105.             //println ("***ReallySetting pocketlightspawner at " + local.triggerent[local.i].origin)
  106.             local.triggerent[local.i].target = ""
  107.             waitthread PocketLightsSetSpawner local.triggerent[local.i] local.triggerent[local.i].set
  108.         }
  109.         
  110.     }
  111.     else
  112.     {
  113.         println "****No pocketlightspawners found"
  114.     }
  115.  
  116.     if ($triggerpocketlight == NULL)
  117.         level.triggerpocketlightcount = 0
  118.     else
  119.         level.triggerpocketlightcount = $triggerpocketlight.size
  120.  
  121.     if (level.triggerpocketlightcount > 0)
  122.     {
  123.         println ("*Final number of triggerpocketlights: " + level.triggerpocketlightcount)
  124.         //level.triggerpocketlight = exec global/makearray.scr $triggerpocketlight
  125.  
  126.         for (local.i=1;local.i<level.triggerpocketlightcount+1;local.i++)
  127.         {
  128.             if ($triggerpocketlight[local.i].set == NIL)
  129.             {
  130.                 exec global/error.scr ("Error, pocketlighttrigger at " + $triggerpocketlight[local.i].origin + " has no #set") 1
  131.             }
  132.             else
  133.             {
  134.                 if ($triggerpocketlight[local.i].retrigger == NIL)
  135.                 {
  136.                     $triggerpocketlight[local.i].retrigger = 0
  137.                 }
  138.  
  139.                 if ($triggerpocketlight[local.i].removelights == NIL)
  140.                 {
  141.                     $triggerpocketlight[local.i].removelights = 0
  142.                 }
  143.                 
  144.                 $triggerpocketlight[local.i] thread triggerpocketlightthread
  145.             }
  146.         }
  147.     }
  148.  
  149.     if ($spawnerpocketlight == NULL)
  150.         level.spawnerpocketlightcount = 0
  151.     else
  152.         level.spawnerpocketlightcount = $spawnerpocketlight.size
  153.  
  154.     if (level.spawnerpocketlightcount > 0)
  155.     {
  156.         println ("*Final Number of spawnerpocketlights : " + level.spawnerpocketlightcount)
  157.         
  158.         for (local.i=1;local.i<level.spawnerpocketlightcount+1;local.i++)
  159.         {
  160.             if ($spawnerpocketlight[local.i].set == NIL)
  161.             {
  162.                 exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #set") 1
  163.             }
  164.             else
  165.             {
  166.                 if ($spawnerpocketlight[local.i].fadeintime == NIL)
  167.                     exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #fadeintime") 1
  168.                 
  169.                 if ($spawnerpocketlight[local.i].holdtime == NIL)
  170.                     $spawnerpocketlight[local.i].holdtime = 0
  171.  
  172.                 if ($spawnerpocketlight[local.i].fadeouttime == NIL)
  173.                     exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #fadeouttime") 1
  174.                 
  175.                 if ($spawnerpocketlight[local.i].lightradius == NIL)
  176.                     exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #lightradius") 1
  177.                 
  178.                 if ($spawnerpocketlight[local.i].redcolor == NIL)
  179.                     exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #redcolor") 1
  180.                 
  181.                 if ($spawnerpocketlight[local.i].greencolor == NIL)
  182.                     exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #greencolor") 1
  183.                 
  184.                 if ($spawnerpocketlight[local.i].bluecolor == NIL)
  185.                     exec global/error.scr ("Error, pocketlightspawner at " + $spawnerpocketlight[local.i].origin + " has no #bluecolor") 1
  186.                 
  187.                 if ($spawnerpocketlight[local.i].loop == NIL)
  188.                     $spawnerpocketlight[local.i].loop = 0
  189.                 
  190.                 $spawnerpocketlight[local.i].spawned = 0
  191.                 $spawnerpocketlight[local.i].spawnthread = 0
  192.             }
  193.         }
  194.     }
  195. end
  196.  
  197. PocketLightsTraverseTargets local.ent local.entstring local.set:
  198.     while ($(local.entstring).size > 0)
  199.     {
  200.         local.j = 1
  201.         println ("*****Target " + local.entstring + " is class " + local.ent[local.j].classname)
  202.         println ("*****At origin " + local.ent[local.j].origin)
  203.         if (local.ent[local.j].target)
  204.         {
  205.             local.newentstring = local.ent[local.j].target
  206.             local.newent = $(local.ent[local.j].target)
  207.             println ("*****Has target " + local.newentstring + " with size " + local.newent.size)
  208.             waitthread PocketLightsTraverseTargets local.newent local.newentstring local.set
  209.         }
  210.         
  211.         println ("*********Setting Target " + local.entstring + " is class " + local.ent[local.j].classname)
  212.         println ("*********At origin " + local.ent[local.j].origin)
  213.         local.ent[local.j].target = ""
  214.         if (local.ent[local.j].classname == "Trigger" || local.ent[local.j].classname == "TriggerAll")
  215.         {
  216.             waitthread PocketLightsSetTrigger local[local.j].ent local.set
  217.         }
  218.         else if (local.ent[local.j].classname == "ScriptOrigin")
  219.         {
  220.             waitthread PocketLightsSetSpawner local.ent[local.j] local.set
  221.         }
  222.         else
  223.         {
  224.             exec global/error.scr ("Error,  pocketlight entity at " + local.ent[local.j].origin + " has invalid class type") 1
  225.         }
  226.     }
  227. end
  228.  
  229. PocketLightsSetTrigger local.ent local.set:
  230.     local.ent[1].set = local.set
  231.     local.ent[1].targetname = "triggerpocketlight"
  232. end
  233.  
  234. PocketLightsSetSpawner local.ent local.set:
  235.     local.ent[1].set = local.set
  236.     local.ent[1].targetname = "spawnerpocketlight"
  237. end
  238.  
  239. triggerpocketlightthread:
  240.     self waittill trigger
  241.     println ("*Triggered pocketlight at " + self.origin + " with set " + self.set)
  242.     self.triggeredby = parm.other
  243.     
  244.     if (self.removelights == 1)
  245.         self thread pocketlightremove self.set
  246.     else
  247.         self thread pocketlightspawn self.set
  248.  
  249.     if (self.retrigger == 1)
  250.     {
  251.         while (self istouching self.triggeredby)
  252.         {
  253.             waitframe
  254.         }
  255.         goto triggerpocketlightthread
  256.     }
  257. end
  258.  
  259. //fadeintime
  260. //holdtime
  261. //fadeouttime
  262. //lightradius
  263. //redcolor
  264. //greencolor
  265. //bluecolor
  266. //loop
  267.  
  268. pocketlightspawn local.set:
  269.     for (local.i=1;local.i<level.spawnerpocketlightcount+1;local.i++)
  270.     {
  271.         if ($spawnerpocketlight[local.i].set == local.set && ($spawnerpocketlight[local.i].spawned == 0))
  272.         {
  273.             local.e = $spawnerpocketlight[local.i]
  274.             local.color =(local.e[1].redcolor local.e[1].greencolor local.e[1].bluecolor)
  275.             println ("*Spawning pocket light at " + local.e[1].origin + " set " + local.set)
  276.             local.e[1].ent = waitthread CreatePocketLight local.e[1].origin local.e[1].fadeintime local.e[1].holdtime local.e[1].fadeouttime local.e[1].lightradius local.color local.e[1].loop local.e[1]
  277.             local.e[1].spawned = 1
  278.         }
  279.     }
  280. end
  281.  
  282. pocketlightremove local.set:
  283.     for (local.i=1;local.i<level.spawnerpocketlightcount+1;local.i++)
  284.     {
  285.         if ($spawnerpocketlight[local.i].set == local.set && ($spawnerpocketlight[local.i].spawned == 1))
  286.         {
  287.             if ($spawnerpocketlight[local.i].spawnthread)
  288.             {
  289.                 $spawnerpocketlight[local.i].spawnthread delete
  290.                 $spawnerpocketlight[local.i].spawnthread = 0
  291.             }
  292.  
  293.             if ($spawnerpocketlight[local.i].ent != NIL)
  294.             {
  295.                 println ("*Removing pocket light at " + $spawnerpocketlight[local.i].origin + " set " + local.set)
  296.                 $spawnerpocketlight[local.i].ent remove
  297.                 $spawnerpocketlight[local.i].spawned = 0
  298.             }
  299.         }
  300.     }
  301. end
  302.  
  303. CreatePocketLight local.location local.fadeinTime local.holdTime local.fadeoutTime local.lightRad local.lightColor local.loop local.spawner:
  304.     local.ent = spawn script_model
  305.     local.ent lightOn
  306.     local.ent light (0 0 0)
  307.     local.ent lightRadius local.lightRad
  308.     local.ent model "fx/dummy.tik"
  309.     local.ent.fadeinTime = local.fadeinTime
  310.     local.ent.holdTime = local.holdTime
  311.     local.ent.fadeoutTime = local.fadeoutTime
  312.     local.ent.lightRad = local.lightRad
  313.     local.ent.lightColor = local.lightColor
  314.     local.ent.origin = local.location
  315.     local.ent.loop = local.loop
  316.     local.ent.isDone = 0
  317.     
  318.     if (local.spawner[1] != NIL)
  319.         local.ent.spawner[1] = local.spawner
  320.     else
  321.         local.ent.spawner[1] = 0
  322.     
  323.     local.ent thread PocketLightThread
  324.     
  325.     if (local.spawner[1] != NIL)
  326.     {
  327.         local.spawner[1].spawnthread = parm.previousthread
  328.     }
  329.  
  330. end local.ent
  331.  
  332. PocketLightThread:
  333.     if ((self.fadeinTime != NIL) && (self.fadeinTime != 0.0))
  334.     {
  335.         self.starttime = level.time
  336.         self.endtime = level.time + self.fadeinTime
  337.         local.totaltime = self.endtime - self.starttime
  338.         if (local.totaltime < 0.0)
  339.         {
  340.             local.totaltime = 0.01
  341.         }
  342.         //println "Starting fade in..."
  343.         waitframe
  344.         while (level.time < self.endtime)
  345.         {
  346.             local.currtime = level.time - self.starttime
  347.             if (local.currtime < 0.0)
  348.             {
  349.                 local.currtime = 0
  350.             }
  351.  
  352.             local.scale = local.currtime / local.totaltime
  353.             local.color = self.lightColor
  354.             local.color[0] = self.lightColor[0] * local.scale
  355.             local.color[1] = self.lightColor[1] * local.scale
  356.             local.color[2] = self.lightColor[2] * local.scale
  357.             //self lightOn
  358.             self light (local.color[0] local.color[1] local.color[2])
  359.             waitframe
  360.         }
  361.         //println "Done fading in..."
  362.     }
  363.     
  364.     self light (self.lightColor[0] self.lightColor[1] self.lightColor[2])
  365.     if (self.holdTime != NIL && self.holdTime != 0.0)
  366.     {
  367.         //println "Holding..."
  368.         wait self.holdTime
  369.     }
  370.         
  371.     if ((self.fadeoutTime != NIL) && (self.fadeoutTime != 0.0))
  372.     {
  373.         self.starttime = level.time
  374.         self.endtime = level.time + self.fadeoutTime
  375.         local.totaltime = self.endtime - self.starttime
  376.         if (local.totaltime < 0.0)
  377.         {
  378.             local.totaltime = 0.01
  379.         }
  380.         //println "Starting fade out..."
  381.         waitframe
  382.         while (level.time < self.endtime)
  383.         {
  384.             local.currtime = level.time - self.starttime
  385.             if (local.currtime < 0.0)
  386.             {
  387.                 local.currtime = 0
  388.             }
  389.  
  390.             local.scale = local.currtime / local.totaltime
  391.             local.scale = local.scale - (local.scale * 2)
  392.             local.color = self.lightColor
  393.             local.color[0] = self.lightColor[0] + (self.lightColor[0] * local.scale)
  394.             local.color[1] = self.lightColor[1] + (self.lightColor[1] * local.scale)
  395.             local.color[2] = self.lightColor[2] + (self.lightColor[2] * local.scale)
  396.             self light (local.color[0] local.color[1] local.color[2])
  397.             waitframe
  398.         }
  399.         //println "Done fade out..."
  400.     }
  401.     
  402.     if (self.loop)
  403.     {
  404.         goto PocketLightThread
  405.     }
  406.     
  407.     self.isDone = 1
  408.     wait 0.20
  409.     self.spawner[1].spawned = 0
  410.     self remove
  411. end